package org.jsola.hr.web;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.jsola.core.Page;
import org.jsola.core.Result;
import org.jsola.hr.dto.ChannelAddDTO;
import org.jsola.hr.dto.ChannelUpdateDTO;
import org.jsola.hr.query.ChannelQuery;
import org.jsola.hr.vo.ChannelImportExcelVO;
import org.jsola.hr.vo.ChannelListVO;
import org.jsola.hr.vo.ChannelVO;
import org.jsola.hr.vo.HrSiteVO;
import org.jsola.salary.query.ChannelFeeSettlementQuery;
import org.jsola.salary.vo.ChannelFeeSum;
import org.springframework.core.io.Resource;
import org.springframework.http.ResponseEntity;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;

/**
 * 渠道管理
 *
 * @author zhr
 */
@Api(tags = "hr-渠道管理")
public interface IChannelControllerAPI {

    /**
     * 渠道劳务费结算合计
     *
     * @param channelFeeSettlementQuery  查询条件
     * @return 合计
     */
    @ApiOperation(value = "渠道劳务费结算合计")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "channelFeeSettlementQuery", dataType = "ChannelFeeSettlementQuery", value = "渠道劳务费结算查询参数", paramType = "body")
    })
    public Result<ChannelFeeSum> feeSum(ChannelFeeSettlementQuery channelFeeSettlementQuery);

    /**
     * 分页获取渠道详情（渠道列表用）
     * @param channelQuery 查询条件
     * @return 渠道详情
     */
    @ApiOperation(value = "分页获取渠道详情（渠道列表用）")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "channelQuery", dataType = "ChannelQuery", value = "渠道管理查询参数", paramType = "query")
    })
    Result<Page<ChannelListVO>> pageChannelList(ChannelQuery channelQuery);

    /**
     * 渠道同步到招聘经纪人
     * @param channelIds 渠道ids
     * @return 渠道管理展示对象
     */
    @ApiOperation(value = "新增渠道管理")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "channelIds", dataType = "String[]", value = "渠道管理id数组", paramType = "body", allowMultiple = true)
    })
    Result<Integer> synchronizationBroker(String[] channelIds);


    /**
     * 新增渠道管理
     *
     * @param channelAddDTO 渠道管理新增实体
     * @return 渠道管理展示对象
     */
    @ApiOperation(value = "新增渠道管理")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "channelAddDTO", dataType = "ChannelAddDTO", value = "新增渠道管理", paramType = "body")
    })
    Result<ChannelVO> save(ChannelAddDTO channelAddDTO);

    /**
     * 导入excel，新增渠道管理
     * @param file excel
     * @return 出错的数据(电话或者名称重复)
     */
    @ApiOperation(value = "导入excel，新增渠道管理")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "file", dataType = "MultipartFile", value = "确认离职EXCEL", paramType = "body")
    })
    Result<ChannelImportExcelVO> importChannel(MultipartFile file);



    /**
     * 修改渠道管理
     *
     * @param channelUpdateDTO 渠道管理
     * @return 更新数量
     */
    @ApiOperation(value = "修改渠道管理")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "channelUpdateDTO", dataType = "ChannelUpdateDTO", value = "修改渠道管理", paramType = "body")
    })
    Result<Integer> update(ChannelUpdateDTO channelUpdateDTO);


    /**
     * 删除单个渠道管理，彻底删除
     *
     * @param channelId 渠道管理id
     * @return 删除数量
     */
    @ApiOperation(value = "删除单个渠道管理，彻底删除")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "channelId", dataType = "String", value = "渠道管理id", paramType = "path")
    })
    Result<Integer> delete(String channelId);


    /**
     * 批量删除渠道管理，彻底删除
     *
     * @param channelIds 渠道管理id集合
     * @return 删除数量
     */
    @ApiOperation(value = "批量删除渠道管理，彻底删除")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "channelIds", dataType = "String[]", value = "渠道管理id数组", paramType = "body", allowMultiple = true)
    })
    Result<Integer> deleteBatch(String[] channelIds);


    /**
     * 根据渠道管理id查询渠道管理详情
     *
     * @param channelId 渠道管理id
     * @return 渠道管理详情
     */
    @ApiOperation(value = "根据渠道管理id查询渠道管理详情")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "channelId", dataType = "String", value = "渠道管理id", paramType = "path")
    })
    Result<ChannelVO> findById(String channelId);

    /**
     * 查询渠道管理
     *
     * @param channelQuery 渠道管理查询参数
     * @return list
     */
    @ApiOperation(value = "查询渠道管理")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "channelQuery", dataType = "ChannelQuery", value = "渠道管理查询参数", paramType = "query")
    })
    Result<Page<ChannelListVO>> listAllNoSynchronizationBroker(ChannelQuery channelQuery);


    /**
     * 查询渠道管理
     *
     * @param channelQuery 渠道管理查询参数
     * @return page
     */
    @ApiOperation(value = "查询渠道管理")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "channelQuery", dataType = "ChannelQuery", value = "渠道管理查询参数", paramType = "query")
    })
    Result<List<ChannelListVO>> listAll(ChannelQuery channelQuery);


    /**
     * 查询租户下的渠道
     *
     * @param channelQuery 渠道管理查询参数
     * @return list
     */
    @ApiOperation(value = "查询租户下的渠道")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "channelQuery", dataType = "ChannelQuery", value = "渠道管理查询参数", paramType = "query")
    })
    Result<List<ChannelListVO>> listSiteAll(ChannelQuery channelQuery);

    /**
     * 查询渠道管理(小程序)
     *
     * @param siteId 租户id
     * @return page
     */
    @ApiOperation(value = "查询渠道管理(小程序)")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "siteId", dataType = "String", value = "租户id", paramType = "query")
    })
    Result<List<ChannelListVO>> listAllForMini(String siteId);

    /**
     * 查询当前登录人所属租户的渠道
     *
     * @param channelQuery 渠道管理查询参数
     * @return 渠道列表
     */
    @ApiOperation(value = "查询当前登录人所属租户的渠道")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "channelQuery", dataType = "ChannelQuery", value = "渠道管理查询参数", paramType = "query")
    })
    Result<List<ChannelListVO>> listWithSite(ChannelQuery channelQuery);


    /**
     * 分页查询渠道管理
     *
     * @param channelQuery 渠道管理查询参数
     * @return page
     */
    @ApiOperation(value = "分页查询渠道管理")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "channelQuery", dataType = "ChannelQuery", value = "渠道管理查询参数", paramType = "query")
    })
    Result<Page<ChannelListVO>> page(ChannelQuery channelQuery);

    /**
     * 分页查询渠道管理 返回渠道分管用工单位
     *
     * @param channelQuery 渠道管理查询参数
     * @return page
     */
    @ApiOperation(value = "分页查询渠道管理 查询渠道分管用工单位")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "channelQuery", dataType = "ChannelQuery", value = "渠道管理查询参数", paramType = "query")
    })
    Result<Page<ChannelListVO>> pageAndCompany(ChannelQuery channelQuery);


    /**
     * 小程序查询用户渠道所在公司（站点）
     *
     * @return 用户渠道所在公司
     */
    @ApiOperation(value = "小程序查询用户渠道所在公司（站点）")
    Result<List<HrSiteVO>> selectSiteByUserId();

    /**
     * 导出渠道信息
     * @param channelQuery 查询条件
     * @return 文件路径
     */
    @ApiOperation(value = "导出渠道信息")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "channelQuery", dataType = "ChannelQuery", value = "渠道管理查询参数", paramType = "query")
    })
    ResponseEntity<Resource> channelInfoExport(ChannelQuery channelQuery);

}

